package com.reflect2;

import com.reflect1.Student;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Parameter;

/**
 * 反射的学习
 */
public class MyRefectDemo2 {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
        /**
         * Class类中用于获取构造方法的方法
         *    Constructor<?>[] getConstructors()
         *    返回所有公共构造方法对象的数组
         *    Constructor<?>[] getDeleteConstructors()
         *    返回所有构造方法对象的数组
         *    Constructor<?>[] getConstructor(Class<?>...parameterTypes)
         *    返回单个公共构造方法对象
         *    Constructor<?>[] getDeleteConstructor(Class<?>...parameterTypes)
         *    返回单个构造方法对象
         */

        //1.获取class字节码文件的对象
        Class clazz = Class.forName("com.reflect2.Student");

        //2.获取构造方法
        /*Constructor[] cons = clazz.getConstructors();
        for (Constructor con : cons) {
            System.out.println(con);
        }*/
        /*Constructor[] cons2 = clazz.getDeclaredConstructors();
        for (Constructor constructor : cons2) {
            System.out.println(constructor);
        }*/


        //获取结构体中，参数类型是空参的构造方法对象
        Constructor con1 = clazz.getDeclaredConstructor();
        System.out.println(con1);

        //获取结构体中，参数类型是String类型和int类型的构造方法对象
        Constructor con2 = clazz.getDeclaredConstructor(String.class,int.class);
        System.out.println(con2);


        //通过底层的对应的整形数据返回比如public对应1，private对应2
        int con3 = clazz.getModifiers();
        System.out.println(con3);

        //可以返回构造方法的每一个参数
        Parameter[] con2Parameters = con2.getParameters();
        for (Parameter con2Parameter : con2Parameters) {
            System.out.println(con2Parameter);
        }

        Constructor con4 = clazz.getDeclaredConstructor(String.class);
        //暴力反射:表示临时取消权限校验
        con4.setAccessible(true);
        Student stu = (Student) con4.newInstance("张三");
        System.out.println(stu);
    }

}
